A device driver is typically a relatively small piece of software that runs in the kernel space of an operating system to allow user applications to communicate with a peripheral device or hardware of a computing system. For example, printers typically come accompanied with drivers that when installed on a computing system tells the operating system exactly how to print information on a page. In another example, sound card drivers tell your software exactly how to translate data into audio signals that the card can output to a set of speakers. The same applies to video cards, keyboards, monitors, etc.
Some unique aspects of device drivers make them difficult to develop. For example, device driver are much harder to debug and test because they are generally extensions of the kernel and run in kernel space. As opposed to user applications that function in user space and have many mature debugging and testing tools, device driver debugging tools are limited. Even today, one of the most effective ways to debug a device driver is to add a line of code to print out variables or other information onto a display for a developer to see for debugging purposes. This and other techniques tend to be time consuming and not adequate for today's short development time requirements.